package com.ccp.dev.workflow.service;

import com.ccp.dev.core.basic.base.BaseService;
import com.ccp.dev.core.basic.util.UUIDUtils;
import com.ccp.dev.core.basic.web.query.QueryFilter;
import com.ccp.dev.core.util.BeanUtils;

import com.ccp.dev.core.util.Dom4jUtil;
import com.ccp.dev.core.util.XmlBeanUtil;
import com.ccp.dev.form.xml.util.XmlUtil;
import com.ccp.dev.workflow.dao.SysTemplateDao;
import com.ccp.dev.workflow.model.SysTemplate;
import com.ccp.dev.workflow.model.SysTemplateObjectFactory;
import com.ccp.dev.workflow.model.SysTemplates;
import org.dom4j.Document;
import org.dom4j.Element;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.xml.bind.JAXBException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 对象功能:模版管理 Service类
 * @author
 * 创建时间:2011-12-28 14:04:30
 */

@Service
public class SysTemplateService extends BaseService<SysTemplate> {
    @Resource
    private SysTemplateDao sysTemplateDao;

    /**
     * 获取信息类型、用途类型的默认模板
     * @param useType 信息类型
     * @return
     */
    public SysTemplate getDefaultByUseType(Integer useType) {
        return sysTemplateDao.getDefaultByUseType(useType);
    }


    /**
     * 获取对应的消息模板字符串
     * @param useType 信息类型 （查看SysTemplate定义类型）
     * @return
     * @throws Exception
     */
    public Map<String, String> getTempByFun(Integer useType) throws Exception {
        SysTemplate sysTemplate = this.getDefaultByUseType(useType);
        String title;
        String html ;
        String plain;
        Map<String, String> map = new HashMap<String, String>(3);
        if (BeanUtils.isNotEmpty(sysTemplate)) {
            title = sysTemplate.getTitle();
            html = sysTemplate.getHtmlContent();
            plain = sysTemplate.getPlainContent();
        } else {
            throw new Exception("template.not.found");
        }
        map.put(SysTemplate.TEMPLATE_TITLE, title);
        map.put(SysTemplate.TEMPLATE_TYPE_HTML, html);
        map.put(SysTemplate.TEMPLATE_TYPE_PLAIN, plain);
        return map;
    }

    /**
     * 获取默认的消息模板
     */
    public Map<String, String> getDefaultTemp() throws Exception {
        return getTempByFun(SysTemplate.USE_TYPE_NOTIFY);
    }

    /**
     * 获取数据模板
     */
    public List<SysTemplate> getAll(QueryFilter queryFilter) {
        return sysTemplateDao.queryList(queryFilter);
    }

    /**
     * 删除数据模板
     */
    @Transactional(rollbackFor = Exception.class)
    public void delByIds(String[] lAryId) {
        if (!BeanUtils.isEmpty(lAryId)) {
            int len = lAryId.length;
            for (int i = 0; i < len; ++i) {
                sysTemplateDao.delById(lAryId[i]);
            }
        }
    }

    /**
     * 修改默认数据模板
     */
    @Transactional(rollbackFor = Exception.class)
    public void setDefault(String templateId) {
        SysTemplate sysTemplate = sysTemplateDao.getById(templateId);
        sysTemplateDao.updateNotDefaultByUseType(sysTemplate.getUseType());
        sysTemplateDao.updateDefault(templateId);
    }

    /**
     * 删除指定类型模板
     * @param useType
     */
    @Transactional(rollbackFor = Exception.class)
    public void delByUseType(Integer useType) {
        sysTemplateDao.delByUseType(useType);
    }

    /**
     * 导出短信邮件模板
     * @param ids
     * @return
     * @throws JAXBException
     */
    public String exportXml(String[] ids) throws JAXBException {
        List<SysTemplate> sysTemplates = getByIds(ids);
        return exportXml(sysTemplates);
    }

    private String exportXml(List<SysTemplate> sysTemplates) throws JAXBException {
        return marshal(sysTemplates);
    }

    private static String marshal(List<SysTemplate> templateList) throws JAXBException {
        SysTemplates sysTemplates = new SysTemplates();
        sysTemplates.setSysTemplates(templateList);
        return XmlBeanUtil.marshall(sysTemplates, SysTemplateObjectFactory.class);
    }

    private List<SysTemplate> getByIds(String[] ids) {
        List<SysTemplate> sysTemplates = new ArrayList<SysTemplate>();
        for (String id : ids) {
            SysTemplate sysTemplate = sysTemplateDao.getById(id);
            sysTemplates.add(sysTemplate);
        }
        return sysTemplates;
    }

    /**
     * 导入时生成短信邮件模板
     *
     * @param inputStream   文件数据流
     * @param clearAll      是否删除同用途的模板
     * @param setDefault    是否设置为默认
     * @throws Exception
     */
    @Transactional(rollbackFor = Exception.class)
    public void importXml(InputStream inputStream, boolean clearAll, boolean setDefault) throws Exception {
        Document doc = Dom4jUtil.loadXml(inputStream);
        Element root = doc.getRootElement();
        // 验证格式是否正确
        XmlUtil.checkXmlFormat(root, "sysTemplates", "sysTemplates");
        String xmlStr = root.asXML();
        SysTemplates sysTemplates = (SysTemplates) XmlBeanUtil.unmarshall(xmlStr, SysTemplates.class);
        List<SysTemplate> sysTemplateList = sysTemplates.getSysTemplates();

        for (SysTemplate sysTemplate : sysTemplateList) {
            if(this.checkRepeatName(null,sysTemplate.getName())) {
                sysTemplate.setTemplateId(UUIDUtils.getUUIDFor32());
                if (clearAll) {
                    this.delByUseType(sysTemplate.getUseType());
                }
                if (sysTemplate.getIsDefault() != null && SysTemplate.IS_DEFAULT_YES.intValue() == sysTemplate.getIsDefault().intValue()) {
                    SysTemplate temp = this.getDefaultByUseType(sysTemplate.getUseType());
                    if (temp != null) {
                        sysTemplate.setIsDefault(SysTemplate.IS_DEFAULT_NO);
                    }
                }
                this.add(sysTemplate);
                if (setDefault) {
                    this.setDefault(sysTemplate.getTemplateId());
                }
            }else{
                throw new RuntimeException("‘" + sysTemplate.getName() + "’已经存在，请检查你的文件！");
            };
        }
    }

    /**
     * 模板名称校验唯一性
     * @param id    只作用于编辑保存时过滤原数据
     * @param name  模板名称
     * @return   ==ture，名称可用；==false，名称已存在不可用
     */
    public boolean checkRepeatName(String id, String name) {
        return sysTemplateDao.checkRepeatName(id,name) == 0;
    }

}
